import { Request, Response, NextFunction } from 'express';
import { MemoryCache } from '../utils/cache';

/**
 * 简单的内存缓存中间件
 */
const cache = new MemoryCache();

/**
 * 缓存中间件
 * @param ttl 缓存时间（毫秒）
 * @param keyPrefix 缓存键前缀
 */
export const cacheMiddleware = (ttl: number = 60000, keyPrefix?: string) => {
  return (req: Request, res: Response, next: NextFunction) => {
    // 只缓存GET请求
    if (req.method !== 'GET') {
      return next();
    }
    
    const cacheKey = keyPrefix 
      ? `${keyPrefix}:${req.originalUrl}`
      : req.originalUrl;
    
    const cached = cache.get(cacheKey);
    if (cached !== null) {
      res.set('X-Cache', 'HIT');
      return res.json(cached);
    }
    
    // 保存原始的json方法
    const originalJson = res.json.bind(res);
    
    // 重写json方法以缓存响应
    res.json = function(data: any) {
      // 只缓存成功的响应
      if (res.statusCode === 200) {
        cache.set(cacheKey, data, ttl);
        res.set('X-Cache', 'MISS');
      }
      return originalJson(data);
    };
    
    next();
  };
};

/**
 * 清除缓存中间件
 * @param pattern 缓存键模式
 */
export const clearCacheMiddleware = (pattern?: string) => {
  return (req: Request, res: Response, next: NextFunction) => {
    // 清除相关缓存
    if (pattern) {
      // 这里可以实现更复杂的缓存清除逻辑
      cache.clear();
    } else {
      cache.clear();
    }
    next();
  };
};